MFC程序默认系统DPI96时调整的界面,在 【个性设置-显示-中等(win7, xp类似)】 后,
出现控件错位的问题,是因为调整后DPI发生变化,相对的坐标也需要重新调整,修改方法如下:
1.调整函数的实现
#define DEFAULT_DPI 96.0 static int dpiX; static int dpiY; void moveWindow( CWnd &wnd ) { CRect rect; wnd.GetWindowRect(rect); wnd.GetParent()->ScreenToClient(rect); rect.left = (int)(rect.left*DEFAULT_DPI/dpiX); rect.right = (int)(rect.right*DEFAULT_DPI/dpiX); rect.top = (int)(rect.top*DEFAULT_DPI/dpiY); rect.bottom = (int)(rect.bottom*DEFAULT_DPI/dpiY); rect.OffsetRect(CPoint((int)((dpiX-DEFAULT_DPI)/2), (int)((dpiY-DEFAULT_DPI)/2))); wnd.MoveWindow(rect); } void SetDPI( int x, int y ) { dpiX = x; dpiY = y; } int GetDPIX() { return dpiX; } int GetDPIY() { return dpiY; }
2.设置dpi在程序第一个对话框初始化OnInitDialog()时,添加如下代码:
CDC* dc = GetDC(); int dpiX = GetDeviceCaps(dc->GetSafeHdc(), LOGPIXELSX); int dpiY = GetDeviceCaps(dc->GetSafeHdc(), LOGPIXELSY); SetDPI(dpiX, dpiY); ReleaseDC(dc);
如果有通过SetWindowPos函数设置的控件,需要进行比例转换,例如:
button.SetWindowPos(NULL,0,0,(size_t)(width/DEFAULT_DPI*dpiX), (size_t)(height/DEFAULT_DPI*dpiY),SWP_NOMOVE);
之后再调用函数moveWindow(CWnd &wnd)就可以进行坐标转换了。
本页共49段,1320个字符,1687 Byte(字节)